import torch.nn as nn
import torch.optim as optim
import torch
import numpy as np
import random
import torch.utils.data as Data
from collections import OrderedDict

# 作为⼀个单层神经⽹络，线性回归输出层中的神经元和
# 输⼊层中各个输⼊完全连接。因此，线性回归的输出层⼜叫全连接层。
class LinearNet(nn.Module):
    def __init__(self, n_feature):
        super(LinearNet, self).__init__()
        self.linear = nn.Linear(n_feature, 1)
        """
        nn.Linear()：用于设置网络中的全连接层，需要注意的是全连接层的输入与输出都是二维张量, nn.Linear是个类/层
        一般形状为[batch_size, size]，不同于卷积层要求输入输出是四维张量。其用法与形参说明如下：
        torch.nn.Linear(in_features, out_features, bias = True)
        in_features指的是输入的二维张量的大小，即输入的[batch_size, size]中的size。即输入层特征数
        out_features指的是输出的二维张量的大小，即输出的二维张量的形状为[batch_size，output_size]，当然，它也代表了该全连接层的神经元个数。即输出样本特征数
        从输入输出的张量的shape角度来理解，相当于一个输入为[batch_size, in_features]的张量变换成了[batch_size, out_features]的输出张量。
        用法示例
        m = nn.Linear(20, 30)
        input = torch.randn(128, 20)
        output = m(input)
        print(output.size())
        >>torch.size([128, 30])
        """
    # 向前传播
    def forward(self, x):
        y = self.linear(x)
        return y



